package field

import (
	"strings"
	"yunj/pkg/yunj/app/service"
	"yunj/pkg/yunj/core/builder/form"
	"yunj/pkg/yunj/core/consts"
	"yunj/pkg/yunj/core/dto"
)

// 图片上传
type Image struct {
	form.Field
	Multi    bool                       `json:"multi"`     // 是否多图，默认false，单位true是表示多图上传，默认最多上传9张图片。传入数字时，即表示多图上传，最多允许上传限制的数字图片张数
	Size     uint                       `json:"size"`      // 限制上传图片大小限制，默认配置值
	ExtRules map[string]dto.FileExtRule `json:"ext_rules"` // 限制上传图片格式规则限制，默认配置值
	Text     string                     `json:"text"`      // 显示文字
}

func NewImage(id string, title ...string) *Image {
	f := &Image{}
	form.SetFieldInstance(&f.Field, f)
	f.SetFieldId(id)
	if len(title) > 0 {
		f.SetTitle(title[0])
	}
	return f
}

// 设置标题
func (f *Image) SetTitle(title string) *Image {
	f.Title = title
	return f
}

// 设置默认值
func (f *Image) SetDefault(def any) *Image {
	f.Default = def
	return f
}

// 设置描述
func (f *Image) SetDesc(desc string) *Image {
	f.Desc = desc
	return f
}

// 设置验证规则
func (f *Image) SetVerify(rule string) *Image {
	f.Verify = rule
	return f
}

// 设置验证标题
func (f *Image) SetVerifyTitle(verifyTitle string) *Image {
	f.VerifyTitle = verifyTitle
	return f
}

// 增加验证规则
func (f *Image) AddVerify(rule string) *Image {
	f.AddFieldVerify(rule)
	return f
}

// 设置是否只读
func (f *Image) SetReadonly(yes bool) *Image {
	f.Readonly = yes
	return f
}

// 设置栅格布局
// 超小屏幕(手机<768px)、小屏幕(平板≥768px)、中等屏幕(桌面≥992px)、大型屏幕(桌面≥1200px)、超大屏幕(桌面≥1400px)
// 总列数：12
func (f *Image) SetGrid(num ...any) *Image {
	f.Grid = num
	return f
}

// 设置权限
func (f *Image) SetAuth(auth string) *Image {
	f.Auth = auth
	return f
}

// 设置多图上传
func (f *Image) SetMulti(multi bool) *Image {
	f.Multi = multi
	return f
}

// 设置图片大小限制（单位MB）
func (f *Image) SetSize(size uint) *Image {
	f.Size = size
	return f
}

// 设置图片格式规则限制
func (f *Image) SetExtRules(extRules map[string]dto.FileExtRule) *Image {
	f.ExtRules = extRules
	return f
}

// 设置显示文字
func (f *Image) SetText(text string) *Image {
	f.Text = text
	return f
}

// 处理属性
func (f *Image) HandleAttr() error {
	if f.Size <= 0 {
		f.Size = service.SettingValue[uint]("sys", "upload_img_size", consts.UPLOAD_IMG_SIZE)
	}
	if len(f.ExtRules) == 0 {
		f.ExtRules = service.GetAllowImageExtRules()
	}
	if f.Text == "" {
		f.Text = "图片上传"
	}
	if f.Multi {
		if !strings.Contains(f.Verify, "urls") {
			if f.Verify == "" {
				f.Verify = "urls"
			} else {
				f.Verify += "|urls"
			}
		}
	} else {
		if !strings.Contains(f.Verify, "url") {
			if f.Verify == "" {
				f.Verify = "url"
			} else {
				f.Verify += "|url"
			}
		}
	}
	return nil
}
